package com.atguigu.bigdata.scala.chapter05

object Scala07_Function_Hell_3 {

    def main(args: Array[String]): Unit = {

        // TODO 函数式编程 - 地狱

        // TODO 2. 将函数作为参数来使用
        // 在当前的场合下，函数逻辑在被调用时，使用的名称，其实是参数名称
        // 在当前的场合下，函数传递时，主要传递的是逻辑，而不是名称，所以名称可以任意
        //             这就意味着，名称不重要，就可以省略，所以，可以使用匿名函数
        //             匿名函数无需独立声明，只需要传递到函数中即可
        def a( x:Int, y:Int ): Int = {
            x + y
        }
        def b( x:Int, y:Int ): Int = {
            x * y
        }

        // val f = sum _
        def test( f : (Int, Int)=>Int ): Unit = {

            val result = f(10, 20)
            println(result)
        }

        //test( a )
        //test( b )
//        test(
//            ( x:Int, y:Int ) => {
//                x + y
//            }
//        )

//        test(
//            def a( x:Int, y:Int ): Int = {
//                x + y
//            }
//        )
//        test(
//            ( x:Int, y:Int ): Int = {
//                x + y
//            }
//        )
//        test(
//            ( x:Int, y:Int ) = {
//                x + y
//            }
//        )
//        test(
//            ( x:Int, y:Int ) => {
//                x + y
//            }
//        )
//        test( ( x:Int, y:Int ) => { x + y} )
//        test( ( x:Int, y:Int ) => { x * y} )
//        test( ( x:Int, y:Int ) => { x - y} )
//        test( ( x:Int, y:Int ) => { x / y} )

        def test2( f : (String)=>Unit ): Unit = {
            f("zhangsan")
        }

        def fun2( s : String ): Unit = {
            println(s)
        }

        test2( fun2 )
        test2( (s:String)=>{println(s)} )

    }
}
